Setup

library("tidyverse")
library("ggpubr")
library("zoo")
setwd("/mnt/LocalData/behaviour/aDN/aDN_behaviour")

Colours …

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(2)
[1] "#F8766D" "#00BFC4"
genotypes <- read_tsv("../2019_03_06_Courtship/genotype.tsv",col_names = TRUE)
genotypes
# indices_list <- list.files("raw data/") %>% str_subset("_Indices.csv")
indices_list <- list.files("../2019_03_06_Courtship/",recursive = TRUE) %>% str_subset("_Indices.csv") %>% str_subset("Male")
all_indices <- tibble()
for (indices_file in indices_list) {
  video_name <- indices_file %>% str_remove("/.*")
  temp <- read_csv(paste0("../2019_03_06_Courtship/",indices_file))
  temp <- temp %>%
    mutate(video = video_name)
  all_indices <- bind_rows(all_indices,temp)
}
all_indices
all_male_indices <- left_join(x = genotypes,y = all_indices,by=c("video"="video","fly_id"="FlyId"))
ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndexWithFacing)) + 
  geom_boxplot()

p1 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndex)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndexWithFacing)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=TotalCCI)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=TotalCCIwFacing)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 4,
          nrow = 1)

p1 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingIndex)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=ContactIndex)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingIndex)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=FacingIndex)) + 
  geom_boxplot()
p5 <- ggplot(all_male_indices,aes(x=genotype,y=TurningIndex)) + 
  geom_boxplot()
p6 <- ggplot(all_male_indices,aes(x=genotype,y=WingIndex)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4,p5,p6),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 3,
          nrow = 2)

p1 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipInitiation)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipTermination)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipDuration)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3),
          ncol = 3,
          nrow = 1)

df <- all_male_indices %>%
  select(genotype,CourtshipTermination) %>% 
  group_by(genotype) %>% 
  mutate(len=length(CourtshipTermination))
#ggplot(df,aes(x=CourtshipTermination,color=genotype)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 
ggplot(df,aes(x=CourtshipTermination,color=genotype)) + geom_step(aes(y=..y..),stat="ecdf")

df <- all_male_indices %>%
  select(genotype,CourtshipDuration) %>% 
  group_by(genotype) %>% 
  mutate(len=length(CourtshipDuration))
#ggplot(df,aes(x=CourtshipDuration,color=genotype)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 
ggplot(df,aes(x=CourtshipDuration,color=genotype)) + geom_step(aes(y=..y..),stat="ecdf")

p1 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingBoutLength)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=ContactBoutLength)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingBoutLength)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=FacingBoutLength)) + 
  geom_boxplot()
p5 <- ggplot(all_male_indices,aes(x=genotype,y=TurningBoutLength)) + 
  geom_boxplot()
p6 <- ggplot(all_male_indices,aes(x=genotype,y=WingBoutLength)) + 
  geom_boxplot()
p7 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingBoutInterval)) + 
  geom_boxplot()
p8 <- ggplot(all_male_indices,aes(x=genotype,y=ContactBoutInterval)) + 
  geom_boxplot()
p9 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingBoutInterval)) + 
  geom_boxplot()
p10 <- ggplot(all_male_indices,aes(x=genotype,y=FacingBoutInterval)) + 
  geom_boxplot()
p11 <- ggplot(all_male_indices,aes(x=genotype,y=TurningBoutInterval)) + 
  geom_boxplot()
p12 <- ggplot(all_male_indices,aes(x=genotype,y=WingBoutInterval)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4,p5,p6,
                          p7,p8,p9,p10,p11,p12),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 6,
          nrow = 2)

#all_rawdata <- full_join(x = all_rawdata, y = genotypes, by = c("FileName"="video","Id"="fly_id"))
all_rawdata <- all_rawdata %>%
  full_join(x = all_rawdata, y = genotypes, by = c("FileName"="video","Id"="fly_id")) %>% 
  replace_na(list(genotype = "CS female"))
# sum(is.na(all_rawdata$genotype))
# summary(all_rawdata$genotype)
# unique(all_rawdata$genotype)
all_rawdata

# # Extract density data to average
# p <- ggplot_build(test_plot)
# ggplot(as.data.frame(p$data[[1]]), aes(x,y)) + geom_line()
# ggplot(as.data.frame(p$data[[2]]), aes(x,y)) + geom_line()

D genotype distance to other

all_rawdata <- all_rawdata %>%  
  unite("unique_fly",FileName,Id, remove = FALSE) %>% 
  group_by(unique_fly) %>% 
  mutate(
    Multitasking = (Approaching + Encircling + Contact + Turning + WingGesture),
    MultitaskingWithFacing = (Approaching + Encircling + Facing + Contact + Turning + WingGesture),
    Courtship = ifelse(Multitasking>=1, 1, 0),
    CourtshipWithFacing = ifelse(MultitaskingWithFacing>=1, 1, 0),
    MultitaskingWithCopulation = (Approaching + Encircling + Contact + Turning + WingGesture + Copulation),
    MultitaskingWithCopulationWithFacing = (Approaching + Encircling + Facing + Contact + Turning + WingGesture + Copulation),
    CourtshipAndCopulation = ifelse(MultitaskingWithCopulation>=1, 1, 0),
    CourtshipAndCopulationWthFacing = ifelse(MultitaskingWithCopulationWithFacing>=1, 1, 0),
    SmoothedCourtship = ifelse((rollmean(Courtship, 150, fill = c(0,0,0), align = c("left")))>0.5, 1, 0),
    SmoothedCopulation = ifelse((rollmean(Copulation, 1250, fill = c(0,0,0), align = c("center")))>0.5, 1, 0),
    SmoothedDistToOther = ifelse((rollmean(ifelse(dist_to_other__mm > 2, 1, 0), 250, fill = c(1,1,NA), align = c("center")))>0.5, 1, 0)
)

D genotype distance to other

mean distance to other

median distance to other

mean facing angle

median facing angle

median facing angle by sector

mean facing angle by sector

mean facing angle by wee sectors

counts in wee sectors

Total time in sector

Proportion time in sector

Total time in sector

Proportion time in sector

Total count in inner ring

Proportion count in inner ring

Left vs Right wing

calculate_indices <- function(input,){
  
  
  
  
  
  
  
  
  
} 
LS0tCnRpdGxlOiAiKipNYWxlIGNvdXJ0c2hpcCBiZWhhdmlvdXIgLSBhRE4gPiBUTlQqKiIKYXV0aG9yOiAiQWFyb24gTS4gQWxsZW4iCmRhdGU6ICIyNCBGZWJydWFyeSAyMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgo8YnIvPgo8YnIvPgoKIyAqKlNldHVwKioKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoInRpZHl2ZXJzZSIpCmxpYnJhcnkoImdncHViciIpCmxpYnJhcnkoInpvbyIpCnNldHdkKCIvbW50L0xvY2FsRGF0YS9iZWhhdmlvdXIvYUROL2FETl9iZWhhdmlvdXIiKQpgYGAKCiMjIyBDb2xvdXJzIC4uLgogCmBgYHtyfQpnZ19jb2xvcl9odWUgPC0gZnVuY3Rpb24obikgewogIGh1ZXMgPSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpCiAgaGNsKGggPSBodWVzLCBsID0gNjUsIGMgPSAxMDApWzE6bl0KfQpgYGAKCmBgYHtyfQpnZ19jb2xvcl9odWUoMikKYGBgCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZW5vdHlwZXMgPC0gcmVhZF90c3YoIi4uLzIwMTlfMDNfMDZfQ291cnRzaGlwL2dlbm90eXBlLnRzdiIsY29sX25hbWVzID0gVFJVRSkKZ2Vub3R5cGVzCmBgYAoKCgoKCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KIyBpbmRpY2VzX2xpc3QgPC0gbGlzdC5maWxlcygicmF3IGRhdGEvIikgJT4lIHN0cl9zdWJzZXQoIl9JbmRpY2VzLmNzdiIpCmluZGljZXNfbGlzdCA8LSBsaXN0LmZpbGVzKCIuLi8yMDE5XzAzXzA2X0NvdXJ0c2hpcC8iLHJlY3Vyc2l2ZSA9IFRSVUUpICU+JSBzdHJfc3Vic2V0KCJfSW5kaWNlcy5jc3YiKSAlPiUgc3RyX3N1YnNldCgiTWFsZSIpCmFsbF9pbmRpY2VzIDwtIHRpYmJsZSgpCmZvciAoaW5kaWNlc19maWxlIGluIGluZGljZXNfbGlzdCkgewogIHZpZGVvX25hbWUgPC0gaW5kaWNlc19maWxlICU+JSBzdHJfcmVtb3ZlKCIvLioiKQogIHRlbXAgPC0gcmVhZF9jc3YocGFzdGUwKCIuLi8yMDE5XzAzXzA2X0NvdXJ0c2hpcC8iLGluZGljZXNfZmlsZSkpCiAgdGVtcCA8LSB0ZW1wICU+JQogICAgbXV0YXRlKHZpZGVvID0gdmlkZW9fbmFtZSkKICBhbGxfaW5kaWNlcyA8LSBiaW5kX3Jvd3MoYWxsX2luZGljZXMsdGVtcCkKfQphbGxfaW5kaWNlcwpgYGAKCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmFsbF9tYWxlX2luZGljZXMgPC0gbGVmdF9qb2luKHggPSBnZW5vdHlwZXMseSA9IGFsbF9pbmRpY2VzLGJ5PWMoInZpZGVvIj0idmlkZW8iLCJmbHlfaWQiPSJGbHlJZCIpKQpgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvdXJ0c2hpcEluZGV4V2l0aEZhY2luZykpICsgCiAgZ2VvbV9ib3hwbG90KCkKYGBgCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0zfQpwMSA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvdXJ0c2hpcEluZGV4KSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvdXJ0c2hpcEluZGV4V2l0aEZhY2luZykpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Ub3RhbENDSSkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Ub3RhbENDSXdGYWNpbmcpKSArIAogIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgIyBsYWJlbHMgPSBjKCJBcHByb2FjaGluZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiQ29udGFjdEluZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiRW5jaXJjbGluZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiRmFjaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJUdXJuaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJXaW5nSW5kZXgiKSwKICAgICAgICAgICMgaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1BcHByb2FjaGluZ0luZGV4KSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvbnRhY3RJbmRleCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1FbmNpcmNsaW5nSW5kZXgpKSArIAogIGdlb21fYm94cGxvdCgpCnA0IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9RmFjaW5nSW5kZXgpKSArIAogIGdlb21fYm94cGxvdCgpCnA1IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VHVybmluZ0luZGV4KSkgKyAKICBnZW9tX2JveHBsb3QoKQpwNiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PVdpbmdJbmRleCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNiksCiAgICAgICAgICAjIGxhYmVscyA9IGMoIkFwcHJvYWNoaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJDb250YWN0SW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJFbmNpcmNsaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJGYWNpbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIlR1cm5pbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIldpbmdJbmRleCIpLAogICAgICAgICAgIyBoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAyKQpgYGAKCgoKCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9Q291cnRzaGlwSW5pdGlhdGlvbikpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db3VydHNoaXBUZXJtaW5hdGlvbikpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db3VydHNoaXBEdXJhdGlvbikpICsgCiAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KZGYgPC0gYWxsX21hbGVfaW5kaWNlcyAlPiUKICBzZWxlY3QoZ2Vub3R5cGUsQ291cnRzaGlwVGVybWluYXRpb24pICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIG11dGF0ZShsZW49bGVuZ3RoKENvdXJ0c2hpcFRlcm1pbmF0aW9uKSkKI2dncGxvdChkZixhZXMoeD1Db3VydHNoaXBUZXJtaW5hdGlvbixjb2xvcj1nZW5vdHlwZSkpICsgZ2VvbV9zdGVwKGFlcyhsZW49bGVuLHk9Li55Li4gKiBsZW4pLHN0YXQ9ImVjZGYiKSAKZ2dwbG90KGRmLGFlcyh4PUNvdXJ0c2hpcFRlcm1pbmF0aW9uLGNvbG9yPWdlbm90eXBlKSkgKyBnZW9tX3N0ZXAoYWVzKHk9Li55Li4pLHN0YXQ9ImVjZGYiKQpgYGAKCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KZGYgPC0gYWxsX21hbGVfaW5kaWNlcyAlPiUKICBzZWxlY3QoZ2Vub3R5cGUsQ291cnRzaGlwRHVyYXRpb24pICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIG11dGF0ZShsZW49bGVuZ3RoKENvdXJ0c2hpcER1cmF0aW9uKSkKI2dncGxvdChkZixhZXMoeD1Db3VydHNoaXBEdXJhdGlvbixjb2xvcj1nZW5vdHlwZSkpICsgZ2VvbV9zdGVwKGFlcyhsZW49bGVuLHk9Li55Li4gKiBsZW4pLHN0YXQ9ImVjZGYiKSAKZ2dwbG90KGRmLGFlcyh4PUNvdXJ0c2hpcER1cmF0aW9uLGNvbG9yPWdlbm90eXBlKSkgKyBnZW9tX3N0ZXAoYWVzKHk9Li55Li4pLHN0YXQ9ImVjZGYiKQpgYGAKCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9QXBwcm9hY2hpbmdCb3V0TGVuZ3RoKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvbnRhY3RCb3V0TGVuZ3RoKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMyA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUVuY2lyY2xpbmdCb3V0TGVuZ3RoKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwNCA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUZhY2luZ0JvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnA1IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VHVybmluZ0JvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnA2IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9V2luZ0JvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnA3IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9QXBwcm9hY2hpbmdCb3V0SW50ZXJ2YWwpKSArIAogIGdlb21fYm94cGxvdCgpCnA4IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9Q29udGFjdEJvdXRJbnRlcnZhbCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDkgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1FbmNpcmNsaW5nQm91dEludGVydmFsKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMTAgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1GYWNpbmdCb3V0SW50ZXJ2YWwpKSArIAogIGdlb21fYm94cGxvdCgpCnAxMSA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PVR1cm5pbmdCb3V0SW50ZXJ2YWwpKSArIAogIGdlb21fYm94cGxvdCgpCnAxMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PVdpbmdCb3V0SW50ZXJ2YWwpKSArIAogIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQscDUscDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcDcscDgscDkscDEwLHAxMSxwMTIpLAogICAgICAgICAgIyBsYWJlbHMgPSBjKCJBcHByb2FjaGluZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiQ29udGFjdEluZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiRW5jaXJjbGluZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiRmFjaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJUdXJuaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJXaW5nSW5kZXgiKSwKICAgICAgICAgICMgaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDYsCiAgICAgICAgICBucm93ID0gMikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmF3ZGF0YV9saXN0IDwtIGxpc3QuZmlsZXMoIi4uLyIscmVjdXJzaXZlID0gVFJVRSkgJT4lIHN0cl9zdWJzZXQoIl9BTExEQVRBLmNzdiIpICU+JSBzdHJfc3Vic2V0KCJfTWFsZV8iKQphbGxfcmF3ZGF0YSA8LSB0aWJibGUoKQpmb3IgKHJhd2RhdGFfZmlsZSBpbiByYXdkYXRhX2xpc3QpIHsKICB0ZW1wIDwtIHJlYWRfY3N2KHBhc3RlMCgiLi4vIixyYXdkYXRhX2ZpbGUpLHByb2dyZXNzID0gRkFMU0UpCiAgYWxsX3Jhd2RhdGEgPC0gYmluZF9yb3dzKGFsbF9yYXdkYXRhLHRlbXApCn0KYGBgCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JQogIGZ1bGxfam9pbih4ID0gYWxsX3Jhd2RhdGEsIHkgPSBnZW5vdHlwZXMsIGJ5ID0gYygiRmlsZU5hbWUiPSJ2aWRlbyIsIklkIj0iZmx5X2lkIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoZ2Vub3R5cGUgPSAiQ1MgZmVtYWxlIikpCmFsbF9yYXdkYXRhCmBgYAoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihBcmVuYSA9PSAyKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpKQogIApgYGAKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKEFyZW5hID09IDIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2RlbnNpdHkoYWVzKHg9d2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpLHNpemUgPSAyKSArCiAgICBnZW9tX2RlbnNpdHkoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpLHNpemUgPSAyKQpgYGAKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUgCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9kZW5zaXR5KGFlcyh4PXdpbmdfbF9hbmdfX3JhZCwgY29sb3VyID0gIiNGODc2NkQiKSxzaXplID0gMikgKwogICAgZ2VvbV9kZW5zaXR5KGFlcyh4PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSxzaXplID0gMikKYGBgCgoKCgoKCgoKYGBge3J9CiMgIyBFeHRyYWN0IGRlbnNpdHkgZGF0YSB0byBhdmVyYWdlCiMgcCA8LSBnZ3Bsb3RfYnVpbGQodGVzdF9wbG90KQojIGdncGxvdChhcy5kYXRhLmZyYW1lKHAkZGF0YVtbMV1dKSwgYWVzKHgseSkpICsgZ2VvbV9saW5lKCkKIyBnZ3Bsb3QoYXMuZGF0YS5mcmFtZShwJGRhdGFbWzJdXSksIGFlcyh4LHkpKSArIGdlb21fbGluZSgpCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9bWF4X3dpbmdfYW5nX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1tYXhfd2luZ19hbmdfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PW1heF93aW5nX2FuZ19fcmFkLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9bWF4X3dpbmdfYW5nX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWFuZ2xlX2JldHdlZW5fX3JhZCkpICsKICAgIGdlb21fcG9pbnQoKQpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihBcmVuYSA9PSAyKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZmFjaW5nX2FuZ2xlX19yYWQsIGNvbG9yPWFzX2ZhY3RvcihJZCkpKSArCiAgICBnZW9tX3BvaW50KCkKYGBgCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKEFyZW5hID09IDIpICU+JSAKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2RlbnNpdHkoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIGNvbG9yPWFzX2ZhY3RvcihJZCkpLHNpemUgPSAyKQpgYGAKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHlsaW0oMCw2KQpgYGAKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsNikKYGBgCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWRpc3RfdG9fb3RoZXJfX21tLCBjb2xvcj1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoKSAKYGBgCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgoKCgoKIyMjIEQgZ2Vub3R5cGUgZGlzdGFuY2UgdG8gb3RoZXIKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMjcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDI5KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoZGlzdF90b19vdGhlcl9fbW0+Miwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoZGlzdF90b19vdGhlcl9fbW0+Miwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JSAgCiAgdW5pdGUoInVuaXF1ZV9mbHkiLEZpbGVOYW1lLElkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBtdXRhdGUoCiAgICBNdWx0aXRhc2tpbmcgPSAoQXBwcm9hY2hpbmcgKyBFbmNpcmNsaW5nICsgQ29udGFjdCArIFR1cm5pbmcgKyBXaW5nR2VzdHVyZSksCiAgICBNdWx0aXRhc2tpbmdXaXRoRmFjaW5nID0gKEFwcHJvYWNoaW5nICsgRW5jaXJjbGluZyArIEZhY2luZyArIENvbnRhY3QgKyBUdXJuaW5nICsgV2luZ0dlc3R1cmUpLAogICAgQ291cnRzaGlwID0gaWZlbHNlKE11bHRpdGFza2luZz49MSwgMSwgMCksCiAgICBDb3VydHNoaXBXaXRoRmFjaW5nID0gaWZlbHNlKE11bHRpdGFza2luZ1dpdGhGYWNpbmc+PTEsIDEsIDApLAogICAgTXVsdGl0YXNraW5nV2l0aENvcHVsYXRpb24gPSAoQXBwcm9hY2hpbmcgKyBFbmNpcmNsaW5nICsgQ29udGFjdCArIFR1cm5pbmcgKyBXaW5nR2VzdHVyZSArIENvcHVsYXRpb24pLAogICAgTXVsdGl0YXNraW5nV2l0aENvcHVsYXRpb25XaXRoRmFjaW5nID0gKEFwcHJvYWNoaW5nICsgRW5jaXJjbGluZyArIEZhY2luZyArIENvbnRhY3QgKyBUdXJuaW5nICsgV2luZ0dlc3R1cmUgKyBDb3B1bGF0aW9uKSwKICAgIENvdXJ0c2hpcEFuZENvcHVsYXRpb24gPSBpZmVsc2UoTXVsdGl0YXNraW5nV2l0aENvcHVsYXRpb24+PTEsIDEsIDApLAogICAgQ291cnRzaGlwQW5kQ29wdWxhdGlvbld0aEZhY2luZyA9IGlmZWxzZShNdWx0aXRhc2tpbmdXaXRoQ29wdWxhdGlvbldpdGhGYWNpbmc+PTEsIDEsIDApLAogICAgU21vb3RoZWRDb3VydHNoaXAgPSBpZmVsc2UoKHJvbGxtZWFuKENvdXJ0c2hpcCwgMTUwLCBmaWxsID0gYygwLDAsMCksIGFsaWduID0gYygibGVmdCIpKSk+MC41LCAxLCAwKSwKICAgIFNtb290aGVkQ29wdWxhdGlvbiA9IGlmZWxzZSgocm9sbG1lYW4oQ29wdWxhdGlvbiwgMTI1MCwgZmlsbCA9IGMoMCwwLDApLCBhbGlnbiA9IGMoImNlbnRlciIpKSk+MC41LCAxLCAwKSwKICAgIFNtb290aGVkRGlzdFRvT3RoZXIgPSBpZmVsc2UoKHJvbGxtZWFuKGlmZWxzZShkaXN0X3RvX290aGVyX19tbSA+IDIsIDEsIDApLCAyNTAsIGZpbGwgPSBjKDEsMSxOQSksIGFsaWduID0gYygiY2VudGVyIikpKT4wLjUsIDEsIDApCikKYGBgCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpCiAgICAKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPT0xLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpCiAgICAKYGBgCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWREaXN0VG9PdGhlciwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oU21vb3RoZWRDb3B1bGF0aW9uKzAuMSksIGNvbG91cj0gIiMwMEJGQzQiKSkgKwogICAgeGxpbSgyMDAwLDMwMDApCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBzdW1tYXJpc2Uod2hpY2gubWluKFNtb290aGVkRGlzdFRvT3RoZXIpLAogICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkKYGBgCgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPWMoaWZlbHNlKFNtb290aGVkRGlzdFRvT3RoZXI9PTEsIm5vdCBjb3B1bGF0aW5nIiwiY29wdWxhdGluZyIpKSkpCmBgYAoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWRDb3B1bGF0aW9uPT0wLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1TbW9vdGhlZERpc3RUb090aGVyLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PShTbW9vdGhlZENvcHVsYXRpb24rMC4xKSwgY29sb3VyPSAiIzAwQkZDNCIpKSArCiAgICB4bGltKDYwMDAsNzAwMCkKYGBgCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBzdW1tYXJpc2Uod2hpY2gubWluKFNtb290aGVkRGlzdFRvT3RoZXIpLAogICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyMjIEQgZ2Vub3R5cGUgZGlzdGFuY2UgdG8gb3RoZXIKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMjcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPT0xLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDI5KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPjAuNSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPT0xLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9bWF4X3dpbmdfYW5nX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpICsKICAgIHhsaW0oMCxwaSkKYGBgCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9YW5nbGVfYmV0d2Vlbl9fcmFkLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHlsaW0oMCwzKSArCiAgICB4bGltKDAscGkpCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWFuZ2xlX2JldHdlZW5fX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMykgKwogICAgeGxpbSgwLHBpKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1kaXN0X3RvX3dhbGxfX21tLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHlsaW0oMCwyLjIpICsKICAgIHhsaW0oMCwxMCkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWRpc3RfdG9fd2FsbF9fbW0sY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDIuMikgKwogICAgeGxpbSgwLDEwKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1kaXN0X3RvX290aGVyX19tbSxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMikgKwogICAgeGxpbSgwLDIwKQpgYGAKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJCIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZGlzdF90b19vdGhlcl9fbW0sY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDIpICsKICAgIHhsaW0oMCwyMCkKYGBgCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWRpc3RfdG9fb3RoZXJfX21tLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHlsaW0oMCwyKSArCiAgICB4bGltKDAsMjApCmBgYAoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZGlzdF90b19vdGhlcl9fbW0sY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDIpICsKICAgIHhsaW0oMCwyMCkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGlzdF90b19vdGhlciA9IG1lYW4oZGlzdF90b19vdGhlcl9fbW0pKQoKCmBgYAoKCgojIyMgbWVhbiBkaXN0YW5jZSB0byBvdGhlcgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2Rpc3RfdG9fb3RoZXIgPSBtZWFuKGRpc3RfdG9fb3RoZXJfX21tKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZGlzdF90b19vdGhlcikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxMCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9kaXN0X3RvX290aGVyID0gbWVhbihkaXN0X3RvX290aGVyX19tbSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2Rpc3RfdG9fb3RoZXIpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMTApCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGlzdF90b19vdGhlciA9IG1lYW4oZGlzdF90b19vdGhlcl9fbW0pLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9kaXN0X3RvX290aGVyKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEwKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkFsbCBGcmFtZXMiLCJXaW5nIEV4dGVuc2lvbiBGcmFtZXMiLCJOb24tV2luZyBFeHRlbnNpb24gRnJhbWVzIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgojIyMgbWVkaWFuIGRpc3RhbmNlIHRvIG90aGVyCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9kaXN0X3RvX290aGVyID0gbWVkaWFuKGRpc3RfdG9fb3RoZXJfX21tKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9kaXN0X3RvX290aGVyKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEwKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZGlzdF90b19vdGhlciA9IG1lZGlhbihkaXN0X3RvX290aGVyX19tbSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZGlzdF90b19vdGhlcikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxMCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2Rpc3RfdG9fb3RoZXIgPSBtZWRpYW4oZGlzdF90b19vdGhlcl9fbW0pLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2Rpc3RfdG9fb3RoZXIpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMTApCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiQWxsIEZyYW1lcyIsIldpbmcgRXh0ZW5zaW9uIEZyYW1lcyIsIk5vbi1XaW5nIEV4dGVuc2lvbiBGcmFtZXMiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCgoKIyMjIG1lYW4gZmFjaW5nIGFuZ2xlIAoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBbGwgRnJhbWVzIiwiV2luZyBFeHRlbnNpb24gRnJhbWVzIiwiTm9uLVdpbmcgRXh0ZW5zaW9uIEZyYW1lcyIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCgoKCgoKCgoKIyMjIG1lZGlhbiBmYWNpbmcgYW5nbGUKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9mYWNpbmdfYW5nbGUgPSBtZWRpYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkFsbCBGcmFtZXMiLCJXaW5nIEV4dGVuc2lvbiBGcmFtZXMiLCJOb24tV2luZyBFeHRlbnNpb24gRnJhbWVzIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgoKCgojIyMgbWVkaWFuIGZhY2luZyBhbmdsZSBieSBzZWN0b3IKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8IHBpLzYpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9mYWNpbmdfYW5nbGUgPSBtZWRpYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaS82KQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDwgcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpLzYpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwNSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwNiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0LHA1LHA2KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkFsbCBGcmFtZXMiLCJXaW5nIEV4dGVuc2lvbiBGcmFtZXMiLCJOb24tV2luZyBFeHRlbnNpb24gRnJhbWVzIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgojIyMgbWVhbiBmYWNpbmcgYW5nbGUgYnkgc2VjdG9yCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8IHBpLzYpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaS82KQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDwgcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpLzYpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwNSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwNiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0LHA1LHA2KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkFsbCBGcmFtZXMiLCJXaW5nIEV4dGVuc2lvbiBGcmFtZXMiLCJOb24tV2luZyBFeHRlbnNpb24gRnJhbWVzIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCiMjIyBtZWFuIGZhY2luZyBhbmdsZSBieSB3ZWUgc2VjdG9ycwoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDIqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDIqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSAzKnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAzKnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gNCpwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaSkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDQqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSA1KnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpKQpwNiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gNSpwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDYqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQscDUscDYpLAogICAgICAgICAgbGFiZWxzID0gYygiMC1waS82IiwicGkvNi0ycGkvNiIsIjJwaS82LTNwaS82IiwKICAgICAgICAgICAgICAgICAgICAgIjNwaS82LTRwaS82IiwiNHBpLzYtNXBpLzYiLCI1cGkvNi02cGkvNiIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgoKCgoKCgoKIyMjIGNvdW50cyBpbiB3ZWUgc2VjdG9ycwoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSAyKnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gMipwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDMqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAzKnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gNCpwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkpCnA1IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiA0KnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gNSpwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkpCnA2IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiA1KnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gNipwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQscDUscDYpLAogICAgICAgICAgbGFiZWxzID0gYygiMC1waS82IiwicGkvNi0ycGkvNiIsIjJwaS82LTNwaS82IiwKICAgICAgICAgICAgICAgICAgICAgIjNwaS82LTRwaS82IiwiNHBpLzYtNXBpLzYiLCI1cGkvNi02cGkvNiIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKIyMjIyBUb3RhbCB0aW1lIGluIHNlY3RvcgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gMCkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjxwaS84IiwiPnBpLzgiKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKIyMjIyBQcm9wb3J0aW9uIHRpbWUgaW4gc2VjdG9yCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjxwaS84IiwiPnBpLzgiKSwKICAgICAgICAgIGhqdXN0ID0gLTEuNCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDIwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMiwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigpICsKICB0aGVtZV92b2lkKCkKCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIGNvb3JkX3BvbGFyKCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJDIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDIsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgY29vcmRfcG9sYXIoKSArCiAgdGhlbWVfdm9pZCgpCgpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDIwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMiwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigpICsKICB0aGVtZV92b2lkKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgojIyMjIFRvdGFsIHRpbWUgaW4gc2VjdG9yCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gMCkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvOCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiPHBpLzgiLCI+cGkvOCIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgojIyMjIFByb3BvcnRpb24gdGltZSBpbiBzZWN0b3IKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQgPD0gcGkvOCkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjxwaS84IiwiPnBpLzgiKSwKICAgICAgICAgIGhqdXN0ID0gLTEuNCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDQsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYyg0LDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoNCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDQsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoNDAsMTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYyg1MCw1MDAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYyg0MCwxMCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDUwLDUwMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJDIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDQwLDEwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoNTAsNTAwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoNDAsMTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYyg1MCw1MDAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwyNSkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDEwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDI1KSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMTAsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMjUpKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwyNSkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDEwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQogIAoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCiMjIyMgVG90YWwgY291bnQgaW4gaW5uZXIgcmluZwoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8PSAzKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAzKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDw9IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMiksCiAgICAgICAgICBsYWJlbHMgPSBjKCIybW0tM21tIiwiM21tLTEwbW0iKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCiMjIyMgUHJvcG9ydGlvbiBjb3VudCBpbiBpbm5lciByaW5nCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZGlzdF90b19vdGhlcl9fbW0gPiAyICYgZGlzdF90b19vdGhlcl9fbW0gPD0gMykvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGRpc3RfdG9fb3RoZXJfX21tID4gMyAmIGRpc3RfdG9fb3RoZXJfX21tIDw9IDEwKS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMiksCiAgICAgICAgICBsYWJlbHMgPSBjKCIybW0tM21tIiwiM21tLTEwbW0iKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgTGVmdCB2cyBSaWdodCB3aW5nCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oV2luZ0dlc3R1cmVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDQwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiSkFBQkEiLCJ3aW5nIGFuZ2xlIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgSkFBQkEgPSAxMDAqc3VtKFdpbmdHZXN0dXJlW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB3aW5nX2FuZ2xlID0gMTAwKnN1bShtYXhfd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPig0MCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD13aW5nX2FuZ2xlLHk9SkFBQkEsY29sb3VyPWdlbm90eXBlKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSkgKwogICAgc3RhdF9jb3IobGFiZWwueSA9IGMoNTIsNTYsNjAsNjQpLCBzaXplID01KSArCiAgICBzdGF0X3JlZ2xpbmVfZXF1YXRpb24obGFiZWwueSA9IGMoNTAsNTQsNTgsNjIpLCBzaXplID01KSArCiAgICBjb29yZF9maXhlZCgpCmBgYAoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShtYXhfd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPig0MCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGxlZnRfd2luZ19pbmRleCA9IDEwMCpzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC00MCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWxlZnRfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICByaWdodF93aW5nX2luZGV4ID0gMTAwKnN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oNDAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1yaWdodF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJ3aW5nIGluZGV4IiwibGVmdCB3aW5nIiwicmlnaHQgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyM18zIikgJT4lIAogIGZpbHRlcihJZCA9PSAyMSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWRDb3VydHNoaXAsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpICMrCiAgICAjeGxpbSgyMDAwLDMwMDApCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgJT4lCiAgI3NsaWNlKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6d2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfbF9hbmdfX3JhZCwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0IikpCiAgCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM2KSAlPiUKICBzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0td2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSswLjYsV2luZ0dlc3R1cmUtMC4yKSkpKQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzYpICU+JQogIHNsaWNlKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6d2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PS13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFdpbmdHZXN0dXJlPT0xLFdpbmdHZXN0dXJlKzAuNixOQSkpKSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzYpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPjAuNSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkrCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFNtb290aGVkQ29wdWxhdGlvbj09MSxTbW9vdGhlZENvcHVsYXRpb24rNixOQSkpKSkKYGBgCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWREaXN0VG9PdGhlciwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oU21vb3RoZWRDb3B1bGF0aW9uKzAuMSksIGNvbG91cj0gIiMwMEJGQzQiKSkgKwogICAgeGxpbSgyMDAwLDMwMDApCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM2KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1TbW9vdGhlZENvdXJ0c2hpcCwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oU21vb3RoZWRDb3B1bGF0aW9uKzAuMSksIGNvbG91cj0gIiMwMEJGQzQiKSkgIysKICAgICN4bGltKDIwMDAsMzAwMCkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpgYGB7cn0KY2FsY3VsYXRlX2luZGljZXMgPC0gZnVuY3Rpb24oaW5wdXQsKXsKICAKICAKICAKICAKICAKICAKICAKICAKICAKfSAKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK